/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Benjamin Muskalla - Bug 29633 [EditorMgmt] "Open" menu should * have Open With-->Other * Helena Halperin - Bug 298747 [EditorMgmt] Bidi Incorrect file type direction in mirrored "Editor Selection" dialog *******************************************************************************/ package org.eclipse.ui.dialogs; import java.util.ArrayList; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.util.Util; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.osgi.util.TextProcessor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.IWorkbenchHelpContextIds; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.registry.EditorDescriptor; import org.eclipse.ui.internal.registry.EditorRegistry; /** * This class is used to allow the user to select a dialog from the set of * internal and external editors. * * @since 1.1 * */ public final class EditorSelectionDialog extends Dialog { private EditorDescriptor selectedEditor; // RAP [rh] external editors not supported: therefore externalButton, // internalButton and browseExternalEditorsButton are unnecessary // private Button externalButton; private Table editorTable; // private Button browseExternalEditorsButton; // private Button internalButton; private Button okButton; //RAP [rh] unused code due to changes becauase of external editors not supported // private static final String STORE_ID_INTERNAL_EXTERNAL = "EditorSelectionDialog.STORE_ID_INTERNAL_EXTERNAL";//$NON-NLS-1$ private String message = WorkbenchMessages.get().EditorSelection_chooseAnEditor; // RAP [bm]: no external editors // collection of IEditorDescriptor // private IEditorDescriptor[] externalEditors; private IEditorDescriptor[] internalEditors; private IEditorDescriptor[] editorsToFilter; private DialogListener listener = new DialogListener(); private ResourceManager resourceManager; private TableViewer editorTableViewer; // RAP [rh] external editors not supported // private static final String[] Executable_Filters; private static final int TABLE_WIDTH = 200; //RAP [rh] external editors not supported // static { // if (SWT.getPlatform().equals("win32")) {//$NON-NLS-1$ // Executable_Filters = new String[] { "*.exe", "*.bat", "*.*" };//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // } else { // Executable_Filters = new String[] { "*" }; //$NON-NLS-1$ // } // } /** * Create an instance of this class. * * @param parentShell * the parent shell */ public EditorSelectionDialog(Shell parentShell) { super(parentShell); resourceManager = new LocalResourceManager(JFaceResources.getResources(parentShell .getDisplay())); } /** * This method is called if a button has been pressed. */ protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { saveWidgetValues(); } super.buttonPressed(buttonId); } /** * Close the window. */ public boolean close() { boolean result = super.close(); resourceManager.dispose(); resourceManager = null; return result; } /* * (non-Javadoc) Method declared in Window. */ protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(WorkbenchMessages.get().EditorSelection_title); PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IWorkbenchHelpContextIds.EDITOR_SELECTION_DIALOG); } /** * Creates and returns the contents of the upper part of the dialog (above * the button bar). * * Subclasses should overide. * * @param parent * the parent composite to contain the dialog area * @return the dialog area control */ protected Control createDialogArea(Composite parent) { Font font = parent.getFont(); // create main group Composite contents = (Composite) super.createDialogArea(parent); ((GridLayout) contents.getLayout()).numColumns = 2; // begin the layout Label textLabel = new Label(contents, SWT.NONE); textLabel.setText(message); GridData data = new GridData(); data.horizontalSpan = 2; textLabel.setLayoutData(data); textLabel.setFont(font); // RAP [rh] external editors not supported // internalButton = new Button(contents, SWT.RADIO | SWT.LEFT); // internalButton.setText(WorkbenchMessages.EditorSelection_internal); // internalButton.addListener(SWT.Selection, listener); // data = new GridData(); // data.horizontalSpan = 1; // internalButton.setLayoutData(data); // internalButton.setFont(font); // // externalButton = new Button(contents, SWT.RADIO | SWT.LEFT); // externalButton.setText(WorkbenchMessages.EditorSelection_external); // externalButton.addListener(SWT.Selection, listener); // data = new GridData(); // data.horizontalSpan = 1; // externalButton.setLayoutData(data); // externalButton.setFont(font); editorTable = new Table(contents, SWT.SINGLE | SWT.BORDER); data = new GridData(); data.widthHint = convertHorizontalDLUsToPixels(TABLE_WIDTH); data.horizontalAlignment = GridData.FILL; data.grabExcessHorizontalSpace = true; data.verticalAlignment = GridData.FILL; data.grabExcessVerticalSpace = true; data.horizontalSpan = 2; editorTable.setLayoutData(data); editorTable.setFont(font); data.heightHint = editorTable.getItemHeight() * 12; editorTableViewer = new TableViewer(editorTable); editorTableViewer.setContentProvider(ArrayContentProvider.getInstance()); editorTableViewer.setLabelProvider(new LabelProvider() { public String getText(Object element) { IEditorDescriptor d = (IEditorDescriptor) element; return TextProcessor.process(d.getLabel(), "."); //$NON-NLS-1$ } public Image getImage(Object element) { IEditorDescriptor d = (IEditorDescriptor) element; return (Image) resourceManager.get(d.getImageDescriptor()); } }); editorTable.addListener(SWT.Selection, listener); editorTable.addListener(SWT.DefaultSelection, listener); // RAP [rh] DblClickListener doesn't work reliable // editorTable.addListener(SWT.MouseDoubleClick, listener); editorTable.addListener(SWT.Selection, listener); editorTable.addListener(SWT.DefaultSelection, listener); editorTable.addListener(SWT.MouseDoubleClick, listener); // RAP [rh] external editors not supported // browseExternalEditorsButton = new Button(contents, SWT.PUSH); // browseExternalEditorsButton // .setText(WorkbenchMessages.EditorSelection_browse); // browseExternalEditorsButton.addListener(SWT.Selection, listener); // data = new GridData(); // int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); // data.widthHint = Math.max(widthHint, browseExternalEditorsButton // .computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); // browseExternalEditorsButton.setLayoutData(data); // browseExternalEditorsButton.setFont(font); restoreWidgetValues(); // Place buttons to the appropriate state fillEditorTable(); updateEnableState(); return contents; } protected void fillEditorTable() { // RAP [bm] no external editors // if (internalButton.getSelection()) { editorTableViewer.setInput(getInternalEditors()); // } else { // editorTableViewer.setInput(getExternalEditors()); // } } /** * Return the dialog store to cache values into */ protected IDialogSettings getDialogSettings() { IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault() .getDialogSettings(); IDialogSettings section = workbenchSettings .getSection("EditorSelectionDialog");//$NON-NLS-1$ if (section == null) { section = workbenchSettings.addNewSection("EditorSelectionDialog");//$NON-NLS-1$ } return section; } // RAP [bm]: no external editors // /** // * Get a list of registered programs from the OS // */ // protected IEditorDescriptor[] getExternalEditors() { // if (externalEditors == null) { // // Since this can take a while, show the busy // // cursor. If the dialog is not yet visible, // // then use the parent shell. // Control shell = getShell(); // if (!shell.isVisible()) { // Control topShell = shell.getParent(); // if (topShell != null) { // shell = topShell; // } // } // //Cursor busy = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT); // Cursor busy = Graphics.getCursor( SWT.CURSOR_WAIT ); // shell.setCursor(busy); // // Get the external editors available // EditorRegistry reg = (EditorRegistry) WorkbenchPlugin.getDefault() // .getEditorRegistry(); // externalEditors = reg.getSortedEditorsFromOS(); // externalEditors = filterEditors(externalEditors); // externalEditorImages = getImages(externalEditors); // // Clean up // shell.setCursor(null); // //busy.dispose(); // } // return externalEditors; // } /** * Returns an array of editors which have been filtered according to the * array of editors in the editorsToFilter instance variable. * * @param editors * an array of editors to filter * @return a filtered array of editors */ protected IEditorDescriptor[] filterEditors(IEditorDescriptor[] editors) { if ((editors == null) || (editors.length < 1)) { return editors; } if ((editorsToFilter == null) || (editorsToFilter.length < 1)) { return editors; } ArrayList filteredList = new ArrayList(); for (int i = 0; i < editors.length; i++) { boolean add = true; for (int j = 0; j < editorsToFilter.length; j++) { if (editors[i].getId().equals(editorsToFilter[j].getId())) { add = false; } } if (add) { filteredList.add(editors[i]); } } return (IEditorDescriptor[]) filteredList .toArray(new IEditorDescriptor[filteredList.size()]); } /** * Returns the internal editors */ protected IEditorDescriptor[] getInternalEditors() { if (internalEditors == null) { EditorRegistry reg = (EditorRegistry) WorkbenchPlugin.getDefault() .getEditorRegistry(); internalEditors = reg.getSortedEditorsFromPlugins(); internalEditors = filterEditors(internalEditors); } return internalEditors; } /** * Return the editor the user selected * * @return the selected editor */ public IEditorDescriptor getSelectedEditor() { return selectedEditor; } // RAP [rh] external editors not supported // protected void promptForExternalEditor() { // FileDialog dialog = new FileDialog(getShell(), SWT.OPEN // | SWT.PRIMARY_MODAL | SWT.SHEET); // dialog.setFilterExtensions(Executable_Filters); // String result = dialog.open(); // if (result != null) { // EditorDescriptor editor = EditorDescriptor.createForProgram(result); // // pretend we had obtained it from the list of os registered editors // TableItem ti = new TableItem(editorTable, SWT.NULL); // ti.setData(editor); // ti.setText(editor.getLabel()); // Image image = editor.getImageDescriptor().createImage(); // ti.setImage(image); // // // need to pass an array to setSelection -- 1FSKYVO: SWT:ALL - // // inconsistent setSelection api on Table // editorTable.setSelection(new TableItem[] { ti }); // editorTable.showSelection(); // editorTable.setFocus(); // selectedEditor = editor; // // /* // * add to our collection of cached external editors in case the user // * flips back and forth between internal/external // */ // IEditorDescriptor[] newEditors = new IEditorDescriptor[externalEditors.length + 1]; // System.arraycopy(externalEditors, 0, newEditors, 0, // externalEditors.length); // newEditors[newEditors.length - 1] = editor; // externalEditors = newEditors; // // Image[] newImages = new Image[externalEditorImages.length + 1]; // System.arraycopy(externalEditorImages, 0, newImages, 0, // externalEditorImages.length); // newImages[newImages.length - 1] = image; // externalEditorImages = newImages; // } // } /** * Handle a double click event on the list */ protected void handleDoubleClickEvent() { buttonPressed(IDialogConstants.OK_ID); } /** * Use the dialog store to restore widget values to the values that they * held last time this wizard was used to completion */ protected void restoreWidgetValues() { // RAP [rh] external editors not supported // IDialogSettings settings = getDialogSettings(); // boolean wasExternal = settings.getBoolean(STORE_ID_INTERNAL_EXTERNAL); // internalButton.setSelection(!wasExternal); // externalButton.setSelection(wasExternal); } /** * Since Finish was pressed, write widget values to the dialog store so that * they will persist into the next invocation of this wizard page */ protected void saveWidgetValues() { // RAP [rh] external editors not supported // IDialogSettings settings = getDialogSettings(); // // record whether use was viewing internal or external editors // settings // .put(STORE_ID_INTERNAL_EXTERNAL, !internalButton.getSelection()); } /** * Set the message displayed by this message dialog * * @param aMessage * the message */ public void setMessage(String aMessage) { message = aMessage; } /** * Set the editors which will not appear in the dialog. * * @param editors * an array of editors */ public void setEditorsToFilter(IEditorDescriptor[] editors) { editorsToFilter = editors; } /** * Update enabled state. */ protected void updateEnableState() { // RAP [rh] external editors not supported // boolean enableExternal = externalButton.getSelection(); // browseExternalEditorsButton.setEnabled(enableExternal); updateOkButton(); } protected void createButtonsForButtonBar(Composite parent) { okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.get().OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.get().CANCEL_LABEL, false); // initially there is no selection so OK button should not be enabled okButton.setEnabled(false); } /** * Update the button enablement state. */ protected void updateOkButton() { // Buttons are null during dialog creation if (okButton == null) { return; } // If there is no selection, do not enable OK button if (editorTable.getSelectionCount() == 0) { okButton.setEnabled(false); return; } // At this point, there is a selection okButton.setEnabled(selectedEditor != null); } private class DialogListener implements Listener { /* * (non-Javadoc) * * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) */ public void handleEvent(Event event) { // RAP [rh] Mouse events don't work reliably with Table // if (event.type == SWT.MouseDoubleClick) { // handleDoubleClickEvent(); // return; // } // RAP [rh] external editors not supported // if (event.widget == externalButton) { // fillEditorTable(); // } else if (event.widget == browseExternalEditorsButton) { // promptForExternalEditor(); /* } else */ if (event.widget == editorTable) { if (editorTable.getSelectionIndex() != -1) { selectedEditor = (EditorDescriptor) editorTable .getSelection()[0].getData(); } else { selectedEditor = null; okButton.setEnabled(false); } } updateEnableState(); } } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#isResizable() * @since 1.4 */ protected boolean isResizable() { return true; } }